package br.puc.casas.model;

import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;

import org.apache.commons.lang.builder.HashCodeBuilder;

/**
 * 
 * @author andrepaes
 */
@Entity
public class Casa implements Serializable {
	private static final long serialVersionUID = 2852174793566592743L;

	@Id
	@GeneratedValue
	private Long id;

	private String nome;

	@Basic(optional = false)
	private float largura;

	@Basic(optional = false)
	private float comprimento;

	@Basic(optional = false)
	private int numeroComodos;

	@OneToOne(cascade = CascadeType.ALL)
	private Telha telha;

	@OneToOne(cascade = CascadeType.ALL)
	private Ambiente ambiente;

	public Casa() {
	}

	public Casa(Telha telha, Ambiente ambiente) {
		this.telha = telha;
		this.ambiente = ambiente;
	}

	public Long getId() {
		return id;
	}

	public Casa setId(Long id) {
		this.id = id;
		return this;
	}

	public String getNome() {
		return nome;
	}

	public Casa setNome(String nome) {
		this.nome = nome;
		return this;
	}

	public float getLargura() {
		return largura;
	}

	public Casa setLargura(float frente) {
		this.largura = frente;
		return this;
	}

	public float getComprimento() {
		return comprimento;
	}

	public void setComprimento(float comprimento) {
		this.comprimento = comprimento;
	}

	public int getNumeroComodos() {
		return numeroComodos;
	}	

	public void setNumeroComodos(int numeroComodos) {
		this.numeroComodos = numeroComodos;
	}

	public Telha getTelha() {
		return telha;
	}

	public Casa setTelha(Telha telha) {
		this.telha = telha;
		return this;
	}

	public Ambiente getAmbiente() {
		return ambiente;
	}

	public Casa setAmbiente(Ambiente ambiente) {
		this.ambiente = ambiente;
		return this;
	}

	/**
	 * Retorna a inclinacao do telhado com base nas informacoes do objeto:
	 * Ambiente, Telha, etc.
	 * 
	 * @return a inclinacao do telhado da casa
	 */
	public float inclinacaoTelhado() {
		if (telha.getPeso() >= 3.2f && ambiente.getTemperatura() >= 27) {
			return 45.0f;
		} else if (telha.getPeso() >= 3.2f && ambiente.getTemperatura() < 27) {
			return 25.0f;
		} else if (telha.getPeso() >= 2.5f && ambiente.getTemperatura() >= 27) {
			return 20.0f;
		} else if (telha.getPeso() >= 2.5f && ambiente.getTemperatura() < 27) {
			return 18.0f;
		}

		return 15.0f;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj instanceof Casa) {
			Casa that = (Casa) obj;
			return this.id == that.id;
		}

		return false;
	}

	@Override
	public int hashCode() {
		return new HashCodeBuilder(13, 29).append(id).hashCode();
	}

	@Override
	public String toString() {
		return super.toString() + "[id = " + id + ", nome = " + nome
				+ ", largura = " + largura + "]";
	}
}
